package util.io.file ;

/**
 * ADAMS Engine Core. 
 * Copyright ⓒ 2010 LGHitachi Co., Ltd. All Rights Reserved.
 * 
 * @Program Name : JFile.java
 * @Description : I/O의 성능을 향상시키기 위한  JFileWriter Interface 를구현한 Byte 단위로 파일 쓰기구현
 * NOTICE !      You can copy or redistribute this code freely,
 * but you should not remove the information about the copyright notice
 * and the author.
 * 
 * @author  : ADAMS Team
 * @version : 1.0
 * @history : 2010. 7. 30. - 최초작성
 */

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class JFile
    implements JFileWriter {
    /**
     * Open 할 File Pointer를 위한 Object Reference Variable
     */
    private FileOutputStream fos = null ;

    /**
     * Open 할 File 의 Name을 위한 Attribute
     */
    private String fName = null ;

    /**
     * Open 할 File 의 Default 쓰기모드로 OPEN
     */
    private final String fMode = "rw" ;

    /**
     * CR = 개행문자,  LF = 커서를 라인의 처음으로, SP = 스페이스, EOF = END OF FILE
     */
    private final int CR = 0x0d;
    private final int LF = 0x0a; 
    private final int SP = 0x20; 
    private final int EOF = -1 ;
    
    /**
     * 생성자
     */
    public JFile () throws FileNotFoundException {
        throw ( new FileNotFoundException (
            "Uage new JFile(FileName);...." ) ) ;
    }


    /**
     * 생성자
     * 1.FileOutputStream 생성
     * @param fname Open 할 파일 명
     */
    public JFile ( String fname ) throws FileNotFoundException {
        if ( fname == null ) {
            throw ( new FileNotFoundException ( "FILE NAME IS NULL.." ) ) ;
        }
        this.fName = fname ;
        fos = new FileOutputStream ( this.fName ) ;
    }


    /**
     * 파일에 데이타를 Write 한다.
     * @param str Write 할  String 데이타 
     */
    public void writeLine ( String str ) throws IOException {
        if ( str == null ) {
            throw new IOException (
                "Method writeLine() Input String is NULL..!! " ) ;
        }
        //String wstr = CharSet.K2E(str);
        String wstr = str ;
        this.write ( wstr.getBytes () ) ;
    }

    /**
     * 파일에 데이타를 Write 한다.
     * @param b Write 할 byte 데이타
     */
    public void write ( byte b ) throws IOException {
        fos.write ( ( int ) b ) ;
    }

    /**
     * File에 데이타를 Write 한다.
     * @param b Write 할 char 데이타
     */
    public void write ( char b ) throws IOException {
        write ( ( byte ) b ) ;
    }

    /**
     * File에 File Pointer 를 이동한다.
     * @param pos          이동할 File Pointer 의 위치
     */
    public void seek ( long pos ) throws IOException {

    }

    /**
     * File에 특정위치에 데이타를 Write 한다.
     * @param b             File에 Write 할  byte data를 저장한 byte배열
     * @param off           File에 Write 할 시작 위치
     * @param len           File에 Write 할 byte길이
     * @return len          File에 Write 할 byte길이
     */
    public int write ( byte[] b, int off, int len ) throws IOException {
        try {
            fos.write ( b, off, len ) ;
        } catch ( IOException e ) {
            throw ( e ) ;
        }
        return len ;
    }

    /**
     * File에 특정위치에 데이타를 Write 한다.
     * @param b             File에 Write 할  byte data를 저장한 byte 배열
     * @param off           File에 Write 할 시작 위치
     * @return write ( b, off, b.length - off )  File에 Write 할 byte 길이
     */
    public int write ( byte[] b, int off ) throws IOException {
        return write ( b, off, b.length - off ) ;
    }

    /**
     * File에 특정위치에 데이타를 Write 한다.
     * @param b             File에 Write 할  byte data를 저장한 byte 배열
     * @return b.length     File에 Write 할 byte 길이
     */
    public int write ( byte[] b ) throws IOException {
        try {
            fos.write ( b ) ;
        } catch ( IOException e ) {
            throw ( e ) ;
        }
        return b.length ;
    }

    /**
     * 파일과 Buffer Stream 을 Close 해서 시스템에 자원을 반납한다.
     */
    public void finalize () throws IOException {
        if ( fos != null ) {
            try {
                fos.close () ;
            } catch ( IOException e ) {
                e.printStackTrace () ;
                throw ( e ) ;
            }
        }
    }

    /**
     * Open 한 File 을 Close 한다.
     * @return   finalize () 
     */
    public void close () throws IOException {
        this.finalize () ;
    }
}
